package guestbook.service;


import com.google.appengine.api.datastore.KeyFactory;
import guestbook.dao.SaludoDAO;
import guestbook.dao.VotoDAO;
import guestbook.persistencia.Saludo;
import guestbook.persistencia.Usuario;
import guestbook.persistencia.Voto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class VotoServiceImpl implements VotoService {

    private SaludoDAO saludoDao;
    private VotoDAO votoDao;


    @Autowired
    @Required
    public void setSaludoDao(final SaludoDAO saludoDao) {
        this.saludoDao = saludoDao;
    }

    @Autowired
    @Required
    public void setVotoDao(final VotoDAO votoDao) {
        this.votoDao = votoDao;
    }



    @Override
    @PreAuthorize("isAuthenticated()")
    public void create(Voto voto) {
        votoDao.insert(voto);
    }

    @Override
    @PreAuthorize("isAuthenticated()")
    @Transactional
    public void create(int valorVoto, Long idMensaje, Usuario usuario) {
        Saludo saludo = saludoDao.findByPK(Saludo.class, idMensaje);
        List<Voto> votos = votoDao.getVotos(usuario.getUsername(),saludo);
        Voto yaVotado = null;
        if (votos != null && !votos.isEmpty()) {
            yaVotado = votos.get(0);
        }
        
        if (yaVotado == null) {
            Voto voto = new Voto();
            voto.setVoto(valorVoto);
            voto.setUsuario(usuario.getUsername());
            saludo.getVotos().add(voto);
        } else {
            System.out.println("AQUI VotoServiceImpl create valorVoto="+valorVoto+" yaVotado="+KeyFactory.keyToString(yaVotado.getId()));
            yaVotado.setVoto(valorVoto);
        }
    }


    @Override
    public Collection<Voto> getVotos(Long idMensaje) {
        Saludo saludo = saludoDao.findByPK(Saludo.class, idMensaje);
        return saludo.getVotos();
    }

    @Override
    public int countVotos(Long idMensaje) {
        return getVotos(idMensaje).size();
    }

    @Override
    public Double avgVotos(Long idMensaje) {
        Saludo saludo = saludoDao.findByPK(Saludo.class, idMensaje);
        Double suma = 0.0;
        for(Voto voto:saludo.getVotos()) {
            suma += voto.getVoto();
        }
        return suma/saludo.getVotos().size();
    }

    @Override
    public List<Voto> getVotos(String username, Saludo saludo) {
        if (username != null && saludo != null) {
            return votoDao.getVotos(username, saludo);
        } else {
            return new ArrayList<Voto>(0);
        }
    }



}
